#include "cards.h"
#include <QRandomGenerator>
#include <QDebug>
Cards::Cards()
{

}

Cards::Cards(const Card &card)
{
    add(card);
}

void Cards::add(const Card &card)
{
    m_cards.insert(card);
}

void Cards::add(const Cards &cards)
{
    m_cards.unite(cards.m_cards);
}

Cards &Cards::operator <<(const Card &card)
{
    add(card);
    return *this;
}
Cards &Cards::operator <<(const Cards &cards)
{
    add(cards);
    return *this;
}

void Cards::remove(Card &card)
{
    m_cards.remove(card);
}

void Cards::remove(Cards &cards)
{
    m_cards.subtract(cards.m_cards);
}

int Cards::CardCount()
{
    return m_cards.size();
}



bool Cards::cardisEmpty()
{
    return m_cards.isEmpty();
}

void Cards::clear()
{
    m_cards.clear();
}

Card::CardPoint Cards::maxPoint()
{
    Card::CardPoint max = Card::Card_Begin;
    if(!m_cards.isEmpty())
    {
        for(auto it = m_cards.begin(); it != m_cards.end(); ++it)
        {
            if(it->Point() > max)
            {
                max = it->Point();
            }
        }
    }
    return max;
}

Card::CardPoint Cards::minPoint()
{
    Card::CardPoint min = Card::Card_Begin;
    if(!m_cards.isEmpty())
    {
        for(auto it = m_cards.begin(); it != m_cards.end(); ++it)
        {
            if(it->Point() > min)
            {
                min = it->Point();
            }
        }
    }
    return min;
}

int Cards::pointCount(Card::CardPoint point)
{
    int count = 0;
    for(auto it = m_cards.begin(); it != m_cards.end(); ++it)
    {
        if(it->Point() == point)
        {
            count++;
        }
    }
    return point;
}

bool Cards::contains(const Card &card)
{
    return m_cards.contains(card);
}
// 检查 一个容器 是否包含另一个容器 的全部函数
bool Cards::contains(const Cards &cards)
{
    return m_cards.contains(cards.m_cards);
}



Card Cards::takeRandomCard()
{
    //生成一个随机数
    qDebug() << "ms:" << m_cards.size() ;
    int num = QRandomGenerator::global()->bounded(m_cards.size());
    QSet<Card>::const_iterator it = m_cards.constBegin();
    for(int i = 0; i < num;++i, ++it);
    Card card = *it;
    m_cards.erase(it);
    return card;
}

CardList Cards::toCardList(Cards::Sortype type)
{
    CardList list;
    for(auto it = m_cards.begin(); it != m_cards.end(); ++it)
    {
        list << *it;
    }
    if( type == Asc)
    {
        std::sort(list.begin(),list.end(),lessSort);
    } else if(type == Desc )
    {
        std::sort(list.begin(),list.end(),greateSort);
    }
    return list;
}
